{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "s_qNSzzyaCbD"
      },
      "source": [
        "##### Copyright 2019 The TensorFlow Authors.\n",
        "\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "jmjh290raIky"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "J0Qjg6vuaHNt"
      },
      "source": [
        "# Neural Machine Translation with Attention"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "AOpGoE2T-YXS"
      },
      "source": [
        "\u003ctable class=\"tfo-notebook-buttons\" align=\"left\"\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://www.tensorflow.org/alpha/tutorials/text/nmt_with_attention\"\u003e\n",
        "    \u003cimg src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" /\u003e\n",
        "    View on TensorFlow.org\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/text/nmt_with_attention.ipynb\"\u003e\n",
        "    \u003cimg src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" /\u003e\n",
        "    Run in Google Colab\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://github.com/tensorflow/docs/blob/master/site/en/r2/tutorials/text/nmt_with_attention.ipynb\"\u003e\n",
        "    \u003cimg src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" /\u003e\n",
        "    View source on GitHub\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "\u003c/table\u003e"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "CiwtNgENbx2g"
      },
      "source": [
        "This notebook trains a sequence to sequence (seq2seq) model for Spanish to English translation. This is an advanced example that assumes some knowledge of sequence to sequence models.\n",
        "\n",
        "After training the model in this notebook, you will be able to input a Spanish sentence, such as *\"¿todavia estan en casa?\"*, and return the English translation: *\"are you still at home?\"*\n",
        "\n",
        "The translation quality is reasonable for a toy example, but the generated attention plot is perhaps more interesting. This shows which parts of the input sentence has the model's attention while translating:\n",
        "\n",
        "\u003cimg src=\"https://tensorflow.org/images/spanish-english.png\" alt=\"spanish-english attention plot\"\u003e\n",
        "\n",
        "Note: This example takes approximately 10 mintues to run on a single P100 GPU."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "tnxXKDjq3jEL"
      },
      "outputs": [],
      "source": [
        "from __future__ import absolute_import, division, print_function, unicode_literals\n",
        "\n",
        "!pip install tensorflow-gpu==2.0.0-alpha0\n",
        "import tensorflow as tf\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "import unicodedata\n",
        "import re\n",
        "import numpy as np\n",
        "import os\n",
        "import io\n",
        "import time"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "wfodePkj3jEa"
      },
      "source": [
        "## Download and prepare the dataset\n",
        "\n",
        "We'll use a language dataset provided by http://www.manythings.org/anki/. This dataset contains language translation pairs in the format:\n",
        "\n",
        "```\n",
        "May I borrow this book?\t¿Puedo tomar prestado este libro?\n",
        "```\n",
        "\n",
        "There are a variety of languages available, but we'll use the English-Spanish dataset. For convenience, we've hosted a copy of this dataset on Google Cloud, but you can also download your own copy. After downloading the dataset, here are the steps we'll take to prepare the data:\n",
        "\n",
        "1. Add a *start* and *end* token to each sentence.\n",
        "2. Clean the sentences by removing special characters.\n",
        "3. Create a word index and reverse word index (dictionaries mapping from word → id and id → word).\n",
        "4. Pad each sentence to a maximum length."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "colab": {
          "height": 69
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 479,
          "status": "ok",
          "timestamp": 1554307805996,
          "user_tz": 420
        },
        "id": "kRVATYOgJs1b",
        "outputId": "a549ee9d-d86a-42ec-d332-ae4c1fe17e49"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Downloading data from http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip\n",
            "2646016/2638744 [==============================] - 0s 0us/step\n",
            "2654208/2638744 [==============================] - 0s 0us/step\n"
          ]
        }
      ],
      "source": [
        "# Download the file\n",
        "path_to_zip = tf.keras.utils.get_file(\n",
        "    'spa-eng.zip', origin='http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip',\n",
        "    extract=True)\n",
        "\n",
        "path_to_file = os.path.dirname(path_to_zip)+\"/spa-eng/spa.txt\""
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "rd0jw-eC3jEh"
      },
      "outputs": [],
      "source": [
        "# Converts the unicode file to ascii\n",
        "def unicode_to_ascii(s):\n",
        "    return ''.join(c for c in unicodedata.normalize('NFD', s)\n",
        "        if unicodedata.category(c) != 'Mn')\n",
        "\n",
        "\n",
        "def preprocess_sentence(w):\n",
        "    w = unicode_to_ascii(w.lower().strip())\n",
        "\n",
        "    # creating a space between a word and the punctuation following it\n",
        "    # eg: \"he is a boy.\" =\u003e \"he is a boy .\"\n",
        "    # Reference:- https://stackoverflow.com/questions/3645931/python-padding-punctuation-with-white-spaces-keeping-punctuation\n",
        "    w = re.sub(r\"([?.!,¿])\", r\" \\1 \", w)\n",
        "    w = re.sub(r'[\" \"]+', \" \", w)\n",
        "\n",
        "    # replacing everything with space except (a-z, A-Z, \".\", \"?\", \"!\", \",\")\n",
        "    w = re.sub(r\"[^a-zA-Z?.!,¿]+\", \" \", w)\n",
        "\n",
        "    w = w.rstrip().strip()\n",
        "\n",
        "    # adding a start and an end token to the sentence\n",
        "    # so that the model know when to start and stop predicting.\n",
        "    w = '\u003cstart\u003e ' + w + ' \u003cend\u003e'\n",
        "    return w"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {
          "height": 52
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 295,
          "status": "ok",
          "timestamp": 1554307806706,
          "user_tz": 420
        },
        "id": "opI2GzOt479E",
        "outputId": "e37289d8-6ad2-4484-9800-4cdd12d8835d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\u003cstart\u003e may i borrow this book ? \u003cend\u003e\n",
            "\u003cstart\u003e ¿ puedo tomar prestado este libro ? \u003cend\u003e\n"
          ]
        }
      ],
      "source": [
        "en_sentence = u\"May I borrow this book?\"\n",
        "sp_sentence = u\"¿Puedo tomar prestado este libro?\"\n",
        "print(preprocess_sentence(en_sentence))\n",
        "print(preprocess_sentence(sp_sentence).encode('utf-8'))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "OHn4Dct23jEm"
      },
      "outputs": [],
      "source": [
        "# 1. Remove the accents\n",
        "# 2. Clean the sentences\n",
        "# 3. Return word pairs in the format: [ENGLISH, SPANISH]\n",
        "def create_dataset(path, num_examples):\n",
        "    lines = io.open(path, encoding='UTF-8').read().strip().split('\\n')\n",
        "\n",
        "    word_pairs = [[preprocess_sentence(w) for w in l.split('\\t')]  for l in lines[:num_examples]]\n",
        "\n",
        "    return zip(*word_pairs)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "height": 72
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 7569,
          "status": "ok",
          "timestamp": 1554307814700,
          "user_tz": 420
        },
        "id": "cTbSbBz55QtF",
        "outputId": "cae22ca9-cac4-4a5f-a8dc-b2c39c95e4ad"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\u003cstart\u003e if you want to sound like a native speaker , you must be willing to practice saying the same sentence over and over in the same way that banjo players practice the same phrase over and over until they can play it correctly and at the desired tempo . \u003cend\u003e\n",
            "\u003cstart\u003e si quieres sonar como un hablante nativo , debes estar dispuesto a practicar diciendo la misma frase una y otra vez de la misma manera en que un musico de banjo practica el mismo fraseo una y otra vez hasta que lo puedan tocar correctamente y en el tiempo esperado . \u003cend\u003e\n"
          ]
        }
      ],
      "source": [
        "en, sp = create_dataset(path_to_file, None)\n",
        "print(en[-1])\n",
        "print(sp[-1])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "OmMZQpdO60dt"
      },
      "outputs": [],
      "source": [
        "def max_length(tensor):\n",
        "    return max(len(t) for t in tensor)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "bIOn8RCNDJXG"
      },
      "outputs": [],
      "source": [
        "def tokenize(lang):\n",
        "  lang_tokenizer = tf.keras.preprocessing.text.Tokenizer(\n",
        "      filters='')\n",
        "  lang_tokenizer.fit_on_texts(lang)\n",
        "\n",
        "  tensor = lang_tokenizer.texts_to_sequences(lang)\n",
        "\n",
        "  tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor,\n",
        "                                                         padding='post')\n",
        "\n",
        "  return tensor, lang_tokenizer"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "eAY9k49G3jE_"
      },
      "outputs": [],
      "source": [
        "def load_dataset(path, num_examples=None):\n",
        "    # creating cleaned input, output pairs\n",
        "    targ_lang, inp_lang = create_dataset(path, num_examples)\n",
        "\n",
        "    input_tensor, inp_lang_tokenizer = tokenize(inp_lang)\n",
        "    target_tensor, targ_lang_tokenizer = tokenize(targ_lang)\n",
        "\n",
        "    return input_tensor, target_tensor, inp_lang_tokenizer, targ_lang_tokenizer"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "GOi42V79Ydlr"
      },
      "source": [
        "### Limit the size of the dataset to experiment faster (optional)\n",
        "\n",
        "Training on the complete dataset of \u003e100,000 sentences will take a long time. To train faster, we can limit the size of the dataset to 30,000 sentences (of course, translation quality degrades with less data):"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "cnxC7q-j3jFD"
      },
      "outputs": [],
      "source": [
        "# Try experimenting with the size of that dataset\n",
        "num_examples = 30000\n",
        "input_tensor, target_tensor, inp_lang, targ_lang = load_dataset(path_to_file, num_examples)\n",
        "\n",
        "# Calculate max_length of the target tensors\n",
        "max_length_targ, max_length_inp = max_length(target_tensor), max_length(input_tensor)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "colab": {
          "height": 35
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 299,
          "status": "ok",
          "timestamp": 1554307820016,
          "user_tz": 420
        },
        "id": "4QILQkOs3jFG",
        "outputId": "761feae1-a83e-4070-8c52-ce29ee5b2779"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(24000, 24000, 6000, 6000)"
            ]
          },
          "execution_count": 12,
          "metadata": {
            "tags": []
          },
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Creating training and validation sets using an 80-20 split\n",
        "input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(input_tensor, target_tensor, test_size=0.2)\n",
        "\n",
        "# Show length\n",
        "len(input_tensor_train), len(target_tensor_train), len(input_tensor_val), len(target_tensor_val)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "lJPmLZGMeD5q"
      },
      "outputs": [],
      "source": [
        "def convert(lang, tensor):\n",
        "  for t in tensor:\n",
        "    if t!=0:\n",
        "      print (\"%d ----\u003e %s\" % (t, lang.index_word[t]))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {
        "colab": {
          "height": 345
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 300,
          "status": "ok",
          "timestamp": 1554307820743,
          "user_tz": 420
        },
        "id": "VXukARTDd7MT",
        "outputId": "ad16ba27-733e-4d2c-b00a-5fccc01e0e55"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Input Language; index to word mapping\n",
            "1 ----\u003e \u003cstart\u003e\n",
            "8 ----\u003e no\n",
            "38 ----\u003e puedo\n",
            "804 ----\u003e confiar\n",
            "20 ----\u003e en\n",
            "1000 ----\u003e vosotras\n",
            "3 ----\u003e .\n",
            "2 ----\u003e \u003cend\u003e\n",
            "\n",
            "Target Language; index to word mapping\n",
            "1 ----\u003e \u003cstart\u003e\n",
            "4 ----\u003e i\n",
            "25 ----\u003e can\n",
            "12 ----\u003e t\n",
            "345 ----\u003e trust\n",
            "6 ----\u003e you\n",
            "3 ----\u003e .\n",
            "2 ----\u003e \u003cend\u003e\n"
          ]
        }
      ],
      "source": [
        "print (\"Input Language; index to word mapping\")\n",
        "convert(inp_lang, input_tensor_train[0])\n",
        "print ()\n",
        "print (\"Target Language; index to word mapping\")\n",
        "convert(targ_lang, target_tensor_train[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "rgCLkfv5uO3d"
      },
      "source": [
        "### Create a tf.data dataset"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "TqHsArVZ3jFS"
      },
      "outputs": [],
      "source": [
        "BUFFER_SIZE = len(input_tensor_train)\n",
        "BATCH_SIZE = 64\n",
        "steps_per_epoch = len(input_tensor_train)//BATCH_SIZE\n",
        "embedding_dim = 256\n",
        "units = 1024\n",
        "vocab_inp_size = len(inp_lang.word_index)+1\n",
        "vocab_tar_size = len(targ_lang.word_index)+1\n",
        "\n",
        "dataset = tf.data.Dataset.from_tensor_slices((input_tensor_train, target_tensor_train)).shuffle(BUFFER_SIZE)\n",
        "dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "colab": {
          "height": 35
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 286,
          "status": "ok",
          "timestamp": 1554307823782,
          "user_tz": 420
        },
        "id": "qc6-NK1GtWQt",
        "outputId": "900d6270-8c4c-428f-e57d-c9a33bb24875"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(TensorShape([64, 16]), TensorShape([64, 11]))"
            ]
          },
          "execution_count": 16,
          "metadata": {
            "tags": []
          },
          "output_type": "execute_result"
        }
      ],
      "source": [
        "example_input_batch, example_target_batch = next(iter(dataset))\n",
        "example_input_batch.shape, example_target_batch.shape"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "TNfHIF71ulLu"
      },
      "source": [
        "## Write the encoder and decoder model\n",
        "\n",
        "Here, we'll implement an encoder-decoder model with attention which you can read about in the TensorFlow [Neural Machine Translation (seq2seq) tutorial](https://www.tensorflow.org/tutorials/seq2seq). This example uses a more recent set of APIs. This notebook implements the [attention equations](https://www.tensorflow.org/tutorials/seq2seq#background_on_the_attention_mechanism) from the seq2seq tutorial. The following diagram shows that each input words is assigned a weight by the attention mechanism which is then used by the decoder to predict the next word in the sentence.\n",
        "\n",
        "\u003cimg src=\"https://www.tensorflow.org/images/seq2seq/attention_mechanism.jpg\" width=\"500\" alt=\"attention mechanism\"\u003e\n",
        "\n",
        "The input is put through an encoder model which gives us the encoder output of shape *(batch_size, max_length, hidden_size)* and the encoder hidden state of shape *(batch_size, hidden_size)*.\n",
        "\n",
        "Here are the equations that are implemented:\n",
        "\n",
        "\u003cimg src=\"https://www.tensorflow.org/images/seq2seq/attention_equation_0.jpg\" alt=\"attention equation 0\" width=\"800\"\u003e\n",
        "\u003cimg src=\"https://www.tensorflow.org/images/seq2seq/attention_equation_1.jpg\" alt=\"attention equation 1\" width=\"800\"\u003e\n",
        "\n",
        "We're using *Bahdanau attention*. Lets decide on notation before writing the simplified form:\n",
        "\n",
        "* FC = Fully connected (dense) layer\n",
        "* EO = Encoder output\n",
        "* H = hidden state\n",
        "* X = input to the decoder\n",
        "\n",
        "And the pseudo-code:\n",
        "\n",
        "* `score = FC(tanh(FC(EO) + FC(H)))`\n",
        "* `attention weights = softmax(score, axis = 1)`. Softmax by default is applied on the last axis but here we want to apply it on the *1st axis*, since the shape of score is *(batch_size, max_length, hidden_size)*. `Max_length` is the length of our input. Since we are trying to assign a weight to each input, softmax should be applied on that axis.\n",
        "* `context vector = sum(attention weights * EO, axis = 1)`. Same reason as above for choosing axis as 1.\n",
        "* `embedding output` = The input to the decoder X is passed through an embedding layer.\n",
        "* `merged vector = concat(embedding output, context vector)`\n",
        "* This merged vector is then given to the GRU\n",
        "\n",
        "The shapes of all the vectors at each step have been specified in the comments in the code:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "nZ2rI24i3jFg"
      },
      "outputs": [],
      "source": [
        "class Encoder(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):\n",
        "    super(Encoder, self).__init__()\n",
        "    self.batch_sz = batch_sz\n",
        "    self.enc_units = enc_units\n",
        "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
        "    self.gru = tf.keras.layers.GRU(self.enc_units,\n",
        "                                   return_sequences=True,\n",
        "                                   return_state=True,\n",
        "                                   recurrent_initializer='glorot_uniform')\n",
        "\n",
        "  def call(self, x, hidden):\n",
        "    x = self.embedding(x)\n",
        "    output, state = self.gru(x, initial_state = hidden)\n",
        "    return output, state\n",
        "\n",
        "  def initialize_hidden_state(self):\n",
        "    return tf.zeros((self.batch_sz, self.enc_units))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {
        "colab": {
          "height": 52
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 503,
          "status": "ok",
          "timestamp": 1554307824710,
          "user_tz": 420
        },
        "id": "60gSVh05Jl6l",
        "outputId": "882aa349-925e-431c-d69f-b7e3e4d5ee8a"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Encoder output shape: (batch size, sequence length, units) (64, 16, 1024)\n",
            "Encoder Hidden state shape: (batch size, units) (64, 1024)\n"
          ]
        }
      ],
      "source": [
        "encoder = Encoder(vocab_inp_size, embedding_dim, units, BATCH_SIZE)\n",
        "\n",
        "# sample input\n",
        "sample_hidden = encoder.initialize_hidden_state()\n",
        "sample_output, sample_hidden = encoder(example_input_batch, sample_hidden)\n",
        "print ('Encoder output shape: (batch size, sequence length, units) {}'.format(sample_output.shape))\n",
        "print ('Encoder Hidden state shape: (batch size, units) {}'.format(sample_hidden.shape))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "umohpBN2OM94"
      },
      "outputs": [],
      "source": [
        "class BahdanauAttention(tf.keras.Model):\n",
        "  def __init__(self, units):\n",
        "    super(BahdanauAttention, self).__init__()\n",
        "    self.W1 = tf.keras.layers.Dense(units)\n",
        "    self.W2 = tf.keras.layers.Dense(units)\n",
        "    self.V = tf.keras.layers.Dense(1)\n",
        "\n",
        "  def call(self, query, values):\n",
        "    # hidden shape == (batch_size, hidden size)\n",
        "    # hidden_with_time_axis shape == (batch_size, 1, hidden size)\n",
        "    # we are doing this to perform addition to calculate the score\n",
        "    hidden_with_time_axis = tf.expand_dims(query, 1)\n",
        "\n",
        "    # score shape == (batch_size, max_length, hidden_size)\n",
        "    score = self.V(tf.nn.tanh(\n",
        "        self.W1(values) + self.W2(hidden_with_time_axis)))\n",
        "\n",
        "    # attention_weights shape == (batch_size, max_length, 1)\n",
        "    # we get 1 at the last axis because we are applying score to self.V\n",
        "    attention_weights = tf.nn.softmax(score, axis=1)\n",
        "\n",
        "    # context_vector shape after sum == (batch_size, hidden_size)\n",
        "    context_vector = attention_weights * values\n",
        "    context_vector = tf.reduce_sum(context_vector, axis=1)\n",
        "\n",
        "    return context_vector, attention_weights"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "metadata": {
        "colab": {
          "height": 52
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 298,
          "status": "ok",
          "timestamp": 1554307825511,
          "user_tz": 420
        },
        "id": "k534zTHiDjQU",
        "outputId": "707a3dcc-aa3f-4b4b-9fe8-73408fe622a6"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Attention result shape: (batch size, units) (64, 1024)\n",
            "Attention weights shape: (batch_size, sequence_length, 1) (64, 16, 1)\n"
          ]
        }
      ],
      "source": [
        "attention_layer = BahdanauAttention(10)\n",
        "attention_result, attention_weights = attention_layer(sample_hidden, sample_output)\n",
        "\n",
        "print(\"Attention result shape: (batch size, units) {}\".format(attention_result.shape))\n",
        "print(\"Attention weights shape: (batch_size, sequence_length, 1) {}\".format(attention_weights.shape))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "yJ_B3mhW3jFk"
      },
      "outputs": [],
      "source": [
        "class Decoder(tf.keras.Model):\n",
        "  def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):\n",
        "    super(Decoder, self).__init__()\n",
        "    self.batch_sz = batch_sz\n",
        "    self.dec_units = dec_units\n",
        "    self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n",
        "    self.gru = tf.keras.layers.GRU(self.dec_units,\n",
        "                                   return_sequences=True,\n",
        "                                   return_state=True,\n",
        "                                   recurrent_initializer='glorot_uniform')\n",
        "    self.fc = tf.keras.layers.Dense(vocab_size)\n",
        "\n",
        "    # used for attention\n",
        "    self.attention = BahdanauAttention(self.dec_units)\n",
        "\n",
        "  def call(self, x, hidden, enc_output):\n",
        "    # enc_output shape == (batch_size, max_length, hidden_size)\n",
        "    context_vector, attention_weights = self.attention(hidden, enc_output)\n",
        "\n",
        "    # x shape after passing through embedding == (batch_size, 1, embedding_dim)\n",
        "    x = self.embedding(x)\n",
        "\n",
        "    # x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)\n",
        "    x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)\n",
        "\n",
        "    # passing the concatenated vector to the GRU\n",
        "    output, state = self.gru(x)\n",
        "\n",
        "    # output shape == (batch_size * 1, hidden_size)\n",
        "    output = tf.reshape(output, (-1, output.shape[2]))\n",
        "\n",
        "    # output shape == (batch_size, vocab)\n",
        "    x = self.fc(output)\n",
        "\n",
        "    return x, state, attention_weights"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "metadata": {
        "colab": {
          "height": 35
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 287,
          "status": "ok",
          "timestamp": 1554307826210,
          "user_tz": 420
        },
        "id": "P5UY8wko3jFp",
        "outputId": "4af7fe6e-24c2-41be-f326-d236e65105a4"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Decoder output shape: (batch_size, vocab size) (64, 4935)\n"
          ]
        }
      ],
      "source": [
        "decoder = Decoder(vocab_tar_size, embedding_dim, units, BATCH_SIZE)\n",
        "\n",
        "sample_decoder_output, _, _ = decoder(tf.random.uniform((64, 1)),\n",
        "                                      sample_hidden, sample_output)\n",
        "\n",
        "print ('Decoder output shape: (batch_size, vocab size) {}'.format(sample_decoder_output.shape))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "_ch_71VbIRfK"
      },
      "source": [
        "## Define the optimizer and the loss function"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "WmTHr5iV3jFr"
      },
      "outputs": [],
      "source": [
        "optimizer = tf.keras.optimizers.Adam()\n",
        "loss_object = tf.keras.losses.SparseCategoricalCrossentropy(\n",
        "    from_logits=True, reduction='none')\n",
        "\n",
        "def loss_function(real, pred):\n",
        "  mask = tf.math.logical_not(tf.math.equal(real, 0))\n",
        "  loss_ = loss_object(real, pred)\n",
        "\n",
        "  mask = tf.cast(mask, dtype=loss_.dtype)\n",
        "  loss_ *= mask\n",
        "\n",
        "  return tf.reduce_mean(loss_)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "DMVWzzsfNl4e"
      },
      "source": [
        "## Checkpoints (Object-based saving)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "Zj8bXQTgNwrF"
      },
      "outputs": [],
      "source": [
        "checkpoint_dir = './training_checkpoints'\n",
        "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n",
        "checkpoint = tf.train.Checkpoint(optimizer=optimizer,\n",
        "                                 encoder=encoder,\n",
        "                                 decoder=decoder)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "hpObfY22IddU"
      },
      "source": [
        "## Training\n",
        "\n",
        "1. Pass the *input* through the *encoder* which return *encoder output* and the *encoder hidden state*.\n",
        "2. The encoder output, encoder hidden state and the decoder input (which is the *start token*) is passed to the decoder.\n",
        "3. The decoder returns the *predictions* and the *decoder hidden state*.\n",
        "4. The decoder hidden state is then passed back into the model and the predictions are used to calculate the loss.\n",
        "5. Use *teacher forcing* to decide the next input to the decoder.\n",
        "6. *Teacher forcing* is the technique where the *target word* is passed as the *next input* to the decoder.\n",
        "7. The final step is to calculate the gradients and apply it to the optimizer and backpropagate."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "sC9ArXSsVfqn"
      },
      "outputs": [],
      "source": [
        "@tf.function\n",
        "def train_step(inp, targ, enc_hidden):\n",
        "  loss = 0\n",
        "\n",
        "  with tf.GradientTape() as tape:\n",
        "    enc_output, enc_hidden = encoder(inp, enc_hidden)\n",
        "\n",
        "    dec_hidden = enc_hidden\n",
        "\n",
        "    dec_input = tf.expand_dims([targ_lang.word_index['\u003cstart\u003e']] * BATCH_SIZE, 1)\n",
        "\n",
        "    # Teacher forcing - feeding the target as the next input\n",
        "    for t in range(1, targ.shape[1]):\n",
        "      # passing enc_output to the decoder\n",
        "      predictions, dec_hidden, _ = decoder(dec_input, dec_hidden, enc_output)\n",
        "\n",
        "      loss += loss_function(targ[:, t], predictions)\n",
        "\n",
        "      # using teacher forcing\n",
        "      dec_input = tf.expand_dims(targ[:, t], 1)\n",
        "\n",
        "  batch_loss = (loss / int(targ.shape[1]))\n",
        "\n",
        "  variables = encoder.trainable_variables + decoder.trainable_variables\n",
        "\n",
        "  gradients = tape.gradient(loss, variables)\n",
        "\n",
        "  optimizer.apply_gradients(zip(gradients, variables))\n",
        "\n",
        "  return batch_loss"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 26,
      "metadata": {
        "colab": {
          "height": 1226
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 312313,
          "status": "ok",
          "timestamp": 1554308139659,
          "user_tz": 420
        },
        "id": "ddefjBMa3jF0",
        "outputId": "f5c9998e-fb15-4629-d625-3247a5daa346"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Epoch 1 Batch 0 Loss 4.5296\n",
            "Epoch 1 Batch 100 Loss 2.2811\n",
            "Epoch 1 Batch 200 Loss 1.7985\n",
            "Epoch 1 Batch 300 Loss 1.6724\n",
            "Epoch 1 Loss 2.0235\n",
            "Time taken for 1 epoch 49.1062328815 sec\n",
            "\n",
            "Epoch 2 Batch 0 Loss 1.5293\n",
            "Epoch 2 Batch 100 Loss 1.5437\n",
            "Epoch 2 Batch 200 Loss 1.3491\n",
            "Epoch 2 Batch 300 Loss 1.2889\n",
            "Epoch 2 Loss 1.4265\n",
            "Time taken for 1 epoch 29.4873349667 sec\n",
            "\n",
            "Epoch 3 Batch 0 Loss 1.2018\n",
            "Epoch 3 Batch 100 Loss 1.1040\n",
            "Epoch 3 Batch 200 Loss 0.9250\n",
            "Epoch 3 Batch 300 Loss 0.9125\n",
            "Epoch 3 Loss 1.0436\n",
            "Time taken for 1 epoch 28.699944973 sec\n",
            "\n",
            "Epoch 4 Batch 0 Loss 0.8126\n",
            "Epoch 4 Batch 100 Loss 0.7823\n",
            "Epoch 4 Batch 200 Loss 0.5725\n",
            "Epoch 4 Batch 300 Loss 0.6476\n",
            "Epoch 4 Loss 0.7258\n",
            "Time taken for 1 epoch 29.6418788433 sec\n",
            "\n",
            "Epoch 5 Batch 0 Loss 0.5145\n",
            "Epoch 5 Batch 100 Loss 0.5257\n",
            "Epoch 5 Batch 200 Loss 0.3696\n",
            "Epoch 5 Batch 300 Loss 0.5020\n",
            "Epoch 5 Loss 0.5033\n",
            "Time taken for 1 epoch 28.412322998 sec\n",
            "\n",
            "Epoch 6 Batch 0 Loss 0.3592\n",
            "Epoch 6 Batch 100 Loss 0.3347\n",
            "Epoch 6 Batch 200 Loss 0.2913\n",
            "Epoch 6 Batch 300 Loss 0.3263\n",
            "Epoch 6 Loss 0.3518\n",
            "Time taken for 1 epoch 29.493874073 sec\n",
            "\n",
            "Epoch 7 Batch 0 Loss 0.2680\n",
            "Epoch 7 Batch 100 Loss 0.2309\n",
            "Epoch 7 Batch 200 Loss 0.2119\n",
            "Epoch 7 Batch 300 Loss 0.2523\n",
            "Epoch 7 Loss 0.2533\n",
            "Time taken for 1 epoch 28.5080609322 sec\n",
            "\n",
            "Epoch 8 Batch 0 Loss 0.1936\n",
            "Epoch 8 Batch 100 Loss 0.1904\n",
            "Epoch 8 Batch 200 Loss 0.1448\n",
            "Epoch 8 Batch 300 Loss 0.1672\n",
            "Epoch 8 Loss 0.1865\n",
            "Time taken for 1 epoch 29.7650489807 sec\n",
            "\n",
            "Epoch 9 Batch 0 Loss 0.1671\n",
            "Epoch 9 Batch 100 Loss 0.1587\n",
            "Epoch 9 Batch 200 Loss 0.1289\n",
            "Epoch 9 Batch 300 Loss 0.1193\n",
            "Epoch 9 Loss 0.1414\n",
            "Time taken for 1 epoch 29.6284649372 sec\n",
            "\n",
            "Epoch 10 Batch 0 Loss 0.1219\n",
            "Epoch 10 Batch 100 Loss 0.1374\n",
            "Epoch 10 Batch 200 Loss 0.1084\n",
            "Epoch 10 Batch 300 Loss 0.0994\n",
            "Epoch 10 Loss 0.1088\n",
            "Time taken for 1 epoch 29.2324090004 sec\n",
            "\n"
          ]
        }
      ],
      "source": [
        "EPOCHS = 10\n",
        "\n",
        "for epoch in range(EPOCHS):\n",
        "  start = time.time()\n",
        "\n",
        "  enc_hidden = encoder.initialize_hidden_state()\n",
        "  total_loss = 0\n",
        "\n",
        "  for (batch, (inp, targ)) in enumerate(dataset.take(steps_per_epoch)):\n",
        "    batch_loss = train_step(inp, targ, enc_hidden)\n",
        "    total_loss += batch_loss\n",
        "\n",
        "    if batch % 100 == 0:\n",
        "        print('Epoch {} Batch {} Loss {:.4f}'.format(epoch + 1,\n",
        "                                                     batch,\n",
        "                                                     batch_loss.numpy()))\n",
        "  # saving (checkpoint) the model every 2 epochs\n",
        "  if (epoch + 1) % 2 == 0:\n",
        "    checkpoint.save(file_prefix = checkpoint_prefix)\n",
        "\n",
        "  print('Epoch {} Loss {:.4f}'.format(epoch + 1,\n",
        "                                      total_loss / steps_per_epoch))\n",
        "  print('Time taken for 1 epoch {} sec\\n'.format(time.time() - start))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "mU3Ce8M6I3rz"
      },
      "source": [
        "## Translate\n",
        "\n",
        "* The evaluate function is similar to the training loop, except we don't use *teacher forcing* here. The input to the decoder at each time step is its previous predictions along with the hidden state and the encoder output.\n",
        "* Stop predicting when the model predicts the *end token*.\n",
        "* And store the *attention weights for every time step*.\n",
        "\n",
        "Note: The encoder output is calculated only once for one input."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "EbQpyYs13jF_"
      },
      "outputs": [],
      "source": [
        "def evaluate(sentence):\n",
        "    attention_plot = np.zeros((max_length_targ, max_length_inp))\n",
        "\n",
        "    sentence = preprocess_sentence(sentence)\n",
        "\n",
        "    inputs = [inp_lang.word_index[i] for i in sentence.split(' ')]\n",
        "    inputs = tf.keras.preprocessing.sequence.pad_sequences([inputs],\n",
        "                                                           maxlen=max_length_inp,\n",
        "                                                           padding='post')\n",
        "    inputs = tf.convert_to_tensor(inputs)\n",
        "\n",
        "    result = ''\n",
        "\n",
        "    hidden = [tf.zeros((1, units))]\n",
        "    enc_out, enc_hidden = encoder(inputs, hidden)\n",
        "\n",
        "    dec_hidden = enc_hidden\n",
        "    dec_input = tf.expand_dims([targ_lang.word_index['\u003cstart\u003e']], 0)\n",
        "\n",
        "    for t in range(max_length_targ):\n",
        "        predictions, dec_hidden, attention_weights = decoder(dec_input,\n",
        "                                                             dec_hidden,\n",
        "                                                             enc_out)\n",
        "\n",
        "        # storing the attention weights to plot later on\n",
        "        attention_weights = tf.reshape(attention_weights, (-1, ))\n",
        "        attention_plot[t] = attention_weights.numpy()\n",
        "\n",
        "        predicted_id = tf.argmax(predictions[0]).numpy()\n",
        "\n",
        "        result += targ_lang.index_word[predicted_id] + ' '\n",
        "\n",
        "        if targ_lang.index_word[predicted_id] == '\u003cend\u003e':\n",
        "            return result, sentence, attention_plot\n",
        "\n",
        "        # the predicted ID is fed back into the model\n",
        "        dec_input = tf.expand_dims([predicted_id], 0)\n",
        "\n",
        "    return result, sentence, attention_plot"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "s5hQWlbN3jGF"
      },
      "outputs": [],
      "source": [
        "# function for plotting the attention weights\n",
        "def plot_attention(attention, sentence, predicted_sentence):\n",
        "    fig = plt.figure(figsize=(10,10))\n",
        "    ax = fig.add_subplot(1, 1, 1)\n",
        "    ax.matshow(attention, cmap='viridis')\n",
        "\n",
        "    fontdict = {'fontsize': 14}\n",
        "\n",
        "    ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n",
        "    ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n",
        "\n",
        "    plt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "sl9zUHzg3jGI"
      },
      "outputs": [],
      "source": [
        "def translate(sentence):\n",
        "    result, sentence, attention_plot = evaluate(sentence)\n",
        "\n",
        "    print('Input: %s' % (sentence))\n",
        "    print('Predicted translation: {}'.format(result))\n",
        "\n",
        "    attention_plot = attention_plot[:len(result.split(' ')), :len(sentence.split(' '))]\n",
        "    plot_attention(attention_plot, sentence.split(' '), result.split(' '))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "n250XbnjOaqP"
      },
      "source": [
        "## Restore the latest checkpoint and test"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 30,
      "metadata": {
        "colab": {
          "height": 35
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 542,
          "status": "ok",
          "timestamp": 1554308141352,
          "user_tz": 420
        },
        "id": "UJpT9D5_OgP6",
        "outputId": "1107a8dc-0e9b-4ffb-ff40-27e8be0f404e"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "\u003ctensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7f747825b850\u003e"
            ]
          },
          "execution_count": 30,
          "metadata": {
            "tags": []
          },
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# restoring the latest checkpoint in checkpoint_dir\n",
        "checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "metadata": {
        "colab": {
          "height": 690
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 474,
          "status": "ok",
          "timestamp": 1554308141897,
          "user_tz": 420
        },
        "id": "WrAM0FDomq3E",
        "outputId": "e28ec13f-62e2-48ee-e9e8-edfc131a1f80"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Input: \u003cstart\u003e hace mucho frio aqui . \u003cend\u003e\n",
            "Predicted translation: it s very cold here . \u003cend\u003e\n"
          ]
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f797184a050\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "translate(u'hace mucho frio aqui.')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 32,
      "metadata": {
        "colab": {
          "height": 690
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 1491,
          "status": "ok",
          "timestamp": 1554308143418,
          "user_tz": 420
        },
        "id": "zSx2iM36EZQZ",
        "outputId": "0734f9fd-6430-4275-d62f-6acbe382f2d9"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Input: \u003cstart\u003e esta es mi vida . \u003cend\u003e\n",
            "Predicted translation: this is my life . \u003cend\u003e\n"
          ]
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAngAAAJ+CAYAAAAgzn0nAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt0leWd9+FfSIIKvFFRUIiKZ6VaBDxj1QILC7SCYNFW\nFJSCujRVK1pRqYeOSh3LqIXaemgdLXa0jELwgAOWeqCeaNWiheKZvoRUEcSIUIEk7x+OeU0hARLk\n2fvmutZyrfBkJ/PN3dF82Hsnu6C2trY2AABIRousBwAAsHkJPACAxAg8AIDECDwAgMQIPACAxAg8\nAIDECDwAgMQIPACAxAg8AIDECDwAgMQIvDzw7rvvxrBhw2LBggVZTwEA8oDAywNTpkyJF198MR58\n8MGspwAAeUDg5bja2tqYNm1anHzyyfHII49EdXV11pMAgBwn8HLc888/H5988kmMHTs2CgsL46mn\nnsp6EgCQ4wRejisvL49vfOMbsd1228W3vvWtmDp1ataTAIAcJ/By2MqVK2PGjBkxcODAiIgYMGBA\nPPnkk/HRRx9lvAwAyGUCL4fNmDEjdtxxxzjssMMiIqJz587RqVOnePTRRzNeBgBpW7lyZUydOjU+\n/vjjrKc0icDLYeXl5TFgwIB61wYMGOBhWgD4kk2fPj0uv/zyKC8vz3pKkwi8HFVZWRkvvPBC3cOz\nnzvxxBPjtddei3feeSejZQCQvqlTp8Zee+0VDz30UNZTmqSgtra2NusRAAC5YtGiRdG3b9+YPHly\nnHLKKTFlypTYd999s561SdyDl8MWL14cDfX34sWLt/AaANg6lJeXx6GHHhqdO3eO448/PqZMmZL1\npE0m8HJY7969Y9myZetc//DDD6N3794ZLAKA9JWXl9f7DRYPP/xwg3e45CqBl8Nqa2ujoKBgnesr\nV66MbbbZJoNFAJC2l156KZYsWRJ9+/aNiIivf/3r8c9//jOeffbZjJdtmqKsB7Cu6667LiIiCgoK\nYvz48bHddtvVva+6ujrmzp0bBx54YFbzACBZU6dOjV69ekWrVq0iIqJly5bRt2/feOihh+KYY47J\neN3GE3g5aMGCBRHx2T14b731VhQXF9e9r2XLlnHQQQfFiBEjspoHAElavXp1TJ8+PcaPH1/v+oAB\nA2LkyJHxySefROvWrTNat2n8FG2Oqq2tjQsvvDBuuOGGaNOmTdZzACB5y5Yti6effjoGDhy4zlOk\nysvLo0ePHtGuXbuM1m0agZejqquro0uXLlFeXp53P5oNAGTLD1nkqMLCwujYsWOsWbMm6ykAQJ5x\nD14OmzJlSjzyyCNx0003Rdu2bbOeAwBJ6tWr13p/a8X6/P73v/+S12wefsgih/3617+ORYsWxXHH\nHRe77rprvZ+mjYh4+OGHM1oGAOk4/fTT695euXJl3H333dGlS5fo2rVrRES88sorMXfu3DjrrLOy\nmrjJBF4O+8Y3vpH1BABI3hd/M8WYMWNi1KhRce6559a7ze233x5vvPHGlp7WZB6iBQD4X927d48p\nU6ZEp06d6l1fuHBhDBo0KF566aWMlm0aP2QBAPC/WrVqFS+++OI611988cV1niqVyzxEm8NWr14d\nv/zlL+PRRx+NxYsXx9q1a+u9f/78+RktA4A0DR8+PK699tp49dVX6z0Hb+rUqVFWVpbxuo3nIdoc\ndtNNN8X06dPj7LPPjnHjxsVFF10UFRUV8eijj8aFF14Y3/nOd7KeCADJeeyxx+Lee++Nt99+OyIi\n9t577xg2bFj0798/42UbT+DlsF69esU111wTxx13XHTr1i3Ky8tjjz32iN/+9rfx/PPPx89+9rOs\nJ+a0Bx98sO7ez3/9fYL58mPusDVavnx5PPPMM1FZWRmrV6+u9758ugcFsuQh2hy2dOnSulexaN26\ndVRVVUVExLHHHhs//elPs5yW8+66666444474tRTT405c+bEaaedFgsXLow//elPXscXctgrr7wS\n55xzThQXF8eHH34Yu+yyS7z//vvRsmXLKC0tFXhsUVVVVVFTU1Pv2g477JDRmk0j8HJYhw4d4v33\n34+OHTvGHnvsEbNnz46DDz44Xnnlldh2222znpfTJk+eHD/+8Y+jb9++MWnSpDj99NNj9913j5//\n/OexePHirOcBDfj3f//3OPHEE+PKK6+M7t27xz333BPbbbddXHzxxfHtb38763lsBSoqKuLqq6+O\nF154od5z32tra6OgoCBvnv8u8HJYnz594rnnnouuXbvGsGHDYvTo0fG73/0u3n///fje976X9byc\n9o9//CO6dOkSERHbbrttrFixIiIivvWtb8WQIUPiuuuuy3Ie0IAFCxbE9ddfHwUFBVFYWBirV6+O\n3XffPS655JK45JJLYsCAAVlPJHGXX355fPzxx3HDDTdE+/btN/oVLnKNwMtho0ePrnu7b9++0aFD\nh3jppZdizz33jJ49e2a4LPftvPPO8eGHH0bHjh2jY8eO8fLLL0fnzp1j4cKFefsvK2wNiouL697e\naaedoqKiIvbZZ59o3bp1vP/++xkuY2vx6quvxgMPPBD7779/1lOaReDlsDlz5kS3bt2iqOiz/5kO\nOeSQOOSQQ2Lt2rUxZ86cOPzwwzNemLuOOuqomDVrVhx00EHx7W9/O8aNGxfTp0+PefPmRb9+/bKe\nBzTgoIMOildffTX22muvOPLII+OWW26JpUuXxrRp0+KAAw7Ieh5bgd12222dH+7JR36KNod17tw5\nZs+eHTvttFO96x9++GH06NEjb54HkIWampqoqampi+PHHnus7t7PU089td69BEDuePXVV+OTTz6J\no446KpYtWxY//OEP6/7dHTdunMjjS/fcc8/FnXfeGVdfffU6r2aRTwReDjvwwAPj2WefjbZt29a7\n/s4778TJJ5+cNy+XkoXFixdHhw4d1nk4tra2NiorK6Njx44ZLQMgl3Xr1i3WrFkT1dXV0bJlyygs\nLKz3/nz53ush2hz0+QscFxQUxKWXXlrv3qaampp44403olu3blnNywu9e/de772fy5cvj969e7v3\nE4D1uuqqq7KesFkIvBy04447RsRn9zaVlJTU+5UoxcXFceihh8aQIUOympcXPv9x9n+1cuXK2Gab\nbTJYBDSkV69eG/3DT35JOV+2QYMGZT1hsxB4OWjcuHEREVFaWhojRoyIVq1aZbwof3z+608KCgpi\n/Pjx9V4Yurq6OubOnRsHHnhgVvOA9Tj99NPr3l65cmXcfffd0aVLl3qvAzp37tw466yzsprIVuaD\nDz6I8vLy+Pvf/x4XXnhhtG3bNv785z9H+/btY/fdd8963kYReDnsvPPOq/fnJUuWxJNPPhn77LNP\ndO/ePaNVuW3BggUR8dk9eG+99Va9h7dbtmwZBx10kFeygBzzxX8nx4wZE6NGjap7qsrnbr/99njj\njTe29DS2Qq+99lqceeaZsdtuu8Wbb74ZI0eOjLZt28azzz4b7777bowfPz7riRtF4OWws88+O449\n9tgYPnx4fPLJJ3HyySfHqlWrYuXKlXH99dfHSSedlPXEnPOb3/wmIj77RZVXXnlltGnTJuNFwKaY\nMWNGTJkyZZ3rffv2jdtvvz2DRWxtbrzxxhg2bFhccMEF9Z7v/rWvfS0eeuihDJdtGoGXw/7617/G\npZdeGhERM2fOjDZt2sTvf//7ePjhh+NXv/qVwGvE5w9zf+6f//xnvPTSS9GpU6coLS3NaFX+cn4b\nNmPGjOjZs2cUFxfHjBkzGr3tCSecsIVW5Z9WrVrFiy++uM6vp3jxxRfrPeUCvix//etf44Ybbljn\nert27eKDDz7IYFHTCLwc9sknn0RJSUlERMyePTv69OkTxcXFcdRRR8WPf/zjjNfltjFjxsRXv/rV\nGDp0aKxevTqGDBkSb7zxRhQXF8fEiRPj+OOPz3piTnN+m+6CCy6IP/7xj7HTTjvFBRdc0ODt8um1\nLLMwfPjwuPbaa+PVV1+t9xy8qVOnRllZWcbr2Bpsu+228dFHH63zXLu33357nd/MkMsEXg77/KXJ\nevbsGbNnz45bb701IiI++uijej9Zy7pmz54dZ5xxRkREzJo1Kz755JP44x//GA8++KBA2QjOb9P9\n7W9/W+/bbJpRo0ZFaWlp3HvvvfH4449HRMTee+8dP/nJT6J///4Zr2Nr0Lt375g4cWL87Gc/q7u2\naNGi+OlPf5pX974LvBx21llnxQ9/+MNo1apVdOzYse6lyebMmZP3r5H3Zfvoo4/q/qb1zDPPxAkn\nnBA77bRT9O/fP37xi19kvC73Ob/mW7JkSbz88suxdOnSqKmpqbteUFAQp512WobLcl///v3FHJm5\n7LLLYtSoUXHUUUfFP//5zzjttNNi6dKl0a1bt7jooouynrfRBF4O+853vhMHH3xwVFZWRo8ePaJF\nixYREbHHHnvEhRdemPG63NauXbt4/fXXo127djF79uy6h7RXrlzpZco2gvNrnvLy8hg7dmzU1tbG\n9ttvv87veBN4kLvatGkT//Vf/xXPPfdczJs3L2pqauKggw6KHj16ZD1tkwi8HPXxxx/HggUL4rDD\nDouDDz643vv+z//5P7HvvvtmtCw/DB48OH7wgx9E+/bto7CwMI4++uiIiPjLX/4Se++9d8brcp/z\na55bbrklRo4cGeeff37d6yHTsO7du8cTTzwRbdu2jW7dujX6S4/z5WWiyE9f/N579NFH1/23LyLi\nz3/+c+y7776x/fbbZ7hw4/kvT44qKCiIUaNGxV133RWHHnpo3fX58+fH8OHD4+mnn85wXe4rKyuL\n/fffPxYvXhz9+vWLli1bRkREUVFRjBw5MuN1uc/5Nc+KFSti8ODB4m4j/ehHP6r7lUapvEwU+Sml\n770tsh7A+rVp0yZ69eoV5eXl9a5PmzYtvva1r0Xbtm0zWpY/ttlmm3j22WfjrLPOisrKyoiIWLNm\nTbRu3TrjZfnB+TXdiSeeGE8++WTWM/LGoEGD6v4S8cQTT0Tr1q3jm9/8ZgwaNGidf+DLlNL3XoGX\nw0466aR4/PHHY82aNRERUVNTEw8//HAMHjw442W5b9q0aXHRRRfFnnvuGYsWLYq1a9dGxGdneNdd\nd2W8Lvc5v+YZM2ZMPP3003HeeefFLbfcEhMnTqz3Dw3bdttt47LLLotjjjkmxo4dG3PmzMl6EluZ\nVL73Crwcdswxx8S2224bf/jDHyIi4rnnnos1a9ZEz549M16W++6666647rrr4oorrojCwsK66127\ndvU7yDaC82ueBx54IJ555pl4+eWX44knnoj/+Z//qfcPDRs/fnw8++yzMXbs2HjvvffirLPOip49\ne8b48eO9VBlbRCrfez1BJIe1aNEiTjzxxJg6dWqccMIJUV5eHv379/dTjBth4cKFdb8k9YtatWoV\nK1asyGBRfnF+zXPbbbfFmDFj4swzz8x6Sl7abrvtYuDAgTFw4MBYtmxZPPbYY3H//ffHr371q5g3\nb17W80hcKt973YOX40466aR45plnorKyMmbOnOk5KBupffv28e67765zfc6cObHHHnts+UF5xvk1\nT01NTfTq1SvrGXnv008/jeeffz5mz54d7777buy6665ZT2IrkcL3XoGX4/bbb7/Yf//9Y/To0bHr\nrrtGly5dsp6UF0455ZS47rrr4s9//nNERFRWVsaUKVPipptuiu9+97sZr8t9zq95Bg8eHNOmTct6\nRl6qqamJ2bNnx2WXXRY9evSIa665Jtq1axd33313zJo1K+t5bCVS+N7rIdo8MHDgwLjhhhviBz/4\nQdZT8saoUaNixYoVMWLEiPj0009j2LBh0bJlyxgxYkQMHTo063k5z/k1z6pVq2Ly5Mkxe/bsOOCA\nA9Z5aGfs2LEZLct9xx57bHz88cdx3HHHxbhx4+LrX/963U/Y0jz9+vWLhQsXeph7I+X7996C2tra\n2qxH0Ljly5fHpEmT4tRTT4127dplPSevrFq1Kt58882ora2NffbZx6/42ETOr2k+fx3f9SkoKIh7\n7713C67JLw888ED069cvSkpKsp6SnEmTJsXy5cujrKws6yl5Id+/9wo8AIDEeA4eAEBiBB4AQGIE\n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\niRF4AACJEXgAAIkReAAAiRF4AACJEXgAAIkReAAAiRF4AACJEXgAAIkReAAAiRF4AACJEXgAAIkR\neAAAiRFDlDEoAAARXklEQVR4AACJEXgAAIkReAAAiRF4AACJKcp6QM6pqf7sn1yVy9vyQW1t1gsa\n9sKrWS9oXA7v23/BDllPaNzFEftfvyDrFQ2aP26/rCds0NLDc/e/fcu6tM96wgb9rSx3N+73g4VZ\nT2hci8KsF6zfBna5Bw8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAx\nAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIP\nACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAg\nMTkZeJdffnmce+6567wdEVFbWxtXXXVVHHnkkdG5c+eYM2dOVjMBAHJSUdYDNuTKK6+s9+ennnoq\npkyZEpMmTYrddtsttt9++4yWAQDkppwPvDZt2tT787vvvhvt2rWLQw45JKNFAAC5LScfov2iMWPG\n1Hu49ic/+UlUVlbGgQceGL1796673Z133hl9+vSJQw45JAYMGBDTpk3LajIAQKZy/h68goKCurev\nvPLK6NixYzz00EPx4IMP1r3v5ptvjhkzZsQ111wTe+65Z7zyyisxduzY2H777eP444/PajoAQCZy\nPvC+qE2bNtG6deto0aJFtG3bNiIiVq1aFf/5n/8Zv/71r+PQQw+NiIjS0tL4y1/+Er/97W8FHgCw\n1cmrwFufN998Mz799NMYOXJkvevV1dWx2267rfdjqqqqoqqqqt61wsLC6NChw5e2EwBgc6usrIzq\n6up610pKSvI/8GprayMi4vbbb18n0IqK1v/l3XPPPTFx4sR610pLS2PWrFkx6Z3bvpyhm8nMmslZ\nT8hrzq/pZlb/LusJee3xpXdkPSGvLTz70qwn5LV3vz866wkN+37WAxo3c+39WU9o1NChQ6OioqLe\ntbKysvwPvH322SdatmwZFRUVccQRR2zUxwwfPjwGDRpU71phYWFERJy+13nx3sIlm33n5jCzZnL0\naTEk6xl5K+fP7wvPN801M6t/F30KT8l6RoMKd9gh6wmNenzpHdF3p7OzntGg+eP2y3pCoxaefWl0\n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\nVkZ1dXW9ayUlJRsXeJMmTYqJEydG9+7dY8aMGQ2G0Lx582LVqlVx5JFH1ru+Zs2aenHWsmXLuriL\niGjfvn2sXbs2qqqqoqSkJN5+++045ZRT6n2Orl271vscX9SqVasYPHhwDB48OObPnx+jR4+OsWPH\nRmFhYZx00knr3P6ee+6JiRMn1rtWWloas2bNiknv3Nb4YWRsZs3krCfkNefXdM6ueZxf88xce3/W\nE/LaU9Mvy3pCI3J5W8TgfV7OekKjhg4dus7T3MrKyjYu8E499dQoLi6OqVOnRv/+/aNPnz4xcODA\nOProo6NFi///KG9NTU3svPPO8dvf/nadz9G6deu6twsLC+u97/Ofjq2pqdn4r+gLVq9eHU8++WRM\nmzYtnnrqqdhvv/3iyiuvjN69e6/39sOHD49BgwbVu/b5ptP3Oi/eW7ikSTu+bDNrJkefFkOynpG3\nnF/TObvmyfnza1G44dtkaOba+6NP0XeyntGg1X26ZT2hUU9NvyyO73dj1jMadOHE3I33wfu8HA+9\nlZv/+7Yq6hB9Oz0W9913X9PvwWvXrl2cc845cc4558TcuXNjypQpcfHFF0dxcXGceOKJMWDAgOjc\nuXMcdNBBsXTp0igoKIjddtutyaP33nvveOWVV2Lw4MF111555ZV1bvenP/0ppk2bFo8//nhsu+22\nceKJJ8aUKVNi3333bfTzl5SURElJSZP3AQDkgoYeVd2owPuiLl26RJcuXeKKK66IP/zhD/HQQw/F\nkCFD4p577okePXpEt27d4rzzzotLLrkk9t5771iyZEnMnj07evToEYceemiDn7e2trbu7WHDhsWY\nMWPiq1/9ahxxxBHx+OOPx9y5c2OHHXaou015eXlcffXV0bt377j55pujR48efk8eAEA0IfA+V1xc\nHCeccEKccMIJsWzZsrqHOO+888645ZZb4qqrroqlS5fGzjvvHN27d1/vc+G+6Itx1r9//1i0aFHc\ncsstsWrVqujVq1ecddZZMWXKlLrb9OjRI/74xz/We+gXAIBmBN4XtW3btu7tVq1axRVXXFHvp2K/\naNCgQes8/+2II46I+fPn17t29tlnx9lnn13vWllZWd3b7dq1a+5sAIAk5dVLlQEAsGECDwAgMQIP\nACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAg\nMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDEC\nDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDECDwAgMQIPACAxAg8AIDFFWQ8AIGM11Vkv2LAc\n3tjyf/6U9YQNyuWNv9hv36wnNGhwTe7u26VTu+j7TsPvdw8eAEBiBB4AQGIEHgBAYgQeAEBiBB4A\nQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBi\nBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQe\nAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGKKsh6Q\nhaqqqqiqqqp3rbCwMDp06JDRIgCATVdZWRnV1dX1rpWUlERBbW1tbUabMjNhwoSYOHFivWulpaUx\na9asjBYBAGy6Xr16RUVFRb1rZWVlW2fgNXYP3ul7nRfvLVyS0bLGzayZHH1aDMl6Rt5yfk3n7JrH\n+TWP82se59d0uXx2u3RqF5Peua3Be/C2yodoS0pKoqSkJOsZAADN0tDTy/yQBQBAYgQeAEBiBB4A\nQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBi\nBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQe\nAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGIEHgBAYgQeAEBiBB4AQGKKsh6Q\na3YubZv1hEbt0qld1hPymvNrOmfXPM6veZxf8zi/psvVs9tQrxTU1tbWbqEtAABsAR6izROVlZXR\nq1evqKyszHpKXnJ+Tefsmsf5NY/zax7n13T5fnYCL09UV1dHRUVFVFdXZz0lLzm/pnN2zeP8msf5\nNY/za7p8PzuBBwCQGIEHAJAYgQcAkJjCa6655pqsR7BxttlmmzjyyCNjm222yXpKXnJ+Tefsmsf5\nNY/zax7n13T5fHb/D7/6TkijmqOYAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f796db23250\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "translate(u'esta es mi vida.')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 33,
      "metadata": {
        "colab": {
          "height": 690
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 591,
          "status": "ok",
          "timestamp": 1554308144315,
          "user_tz": 420
        },
        "id": "A3LLCx3ZE0Ls",
        "outputId": "9437e047-636d-4c5e-dd04-391ec801c6ab"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Input: \u003cstart\u003e ¿ todavia estan en casa ? \u003cend\u003e\n",
            "Predicted translation: are you still at home ? \u003cend\u003e\n"
          ]
        },
        {
          "data": {
            "image/png": "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\nBYzPnDlTDRs2NJDIOUqVKqU1a9aob9++ysnJkSSdO3dOZcuWNZzMnIiICH399dd6+umnlZKSoqCg\nIEVERGjNmjW+o7BLmiFDhviu+JKQkKC5c+eqV69emjJlih555BHD6eA0xfU3moLnEF26dNGyZct8\nO8kXFBRo8eLF6tq1q+FkcJrHH39cCxcu1O23365hw4Zp+PDhuv3227Vo0SLfuRRLokWLFmnw4MG6\n9tprtXfvXt+pLwoKCjRt2jTD6cy5OC+RkZF+85Kfn19i52XSpEn6+9//7rt/ww03qG/fvvr2228d\ne1UCmFUcf6MpeA7xhz/8QaVLl/adDXvt2rU6d+6cbr31VsPJnKegoEBz5szRnj17TEcxIiIiQsuW\nLVNCQoLy8vJ04sQJJSQkaNmyZapevbrpeMZMmzZNY8aM0ciRI/1OG9O4ceMSuZ/ZRcxLoIyMDP3u\nd78LGI+Ojg5YS1OSvP/++5o7d65jT9xrUnH8jabgOURQUJA6duyohQsXSrrwBdShQ4cSffTfpQQF\nBWnbtm166aWXTEcxIi4uTsHBwXrkkUc0ZcoUpaWl6ZFHHlFoaKji4uJMxzNm165dvvPgfV+ZMmV0\n4sQJA4mcgXkJdOjQoUI3q11zzTUltty8/vrrGjRokF599VV16tRJWVlZpiM5SnH8jabgOUiXLl20\natUq5eTkaPny5UpMTDQdyZjk5GQNHz5cycnJeuihhzR//ny/5R06dNC6desMpTPL6/XK5XIFjOfl\n5alUqVIGEjlDlSpV9M033wSMr1+/XrVq1Sr6QA7BvASqXr26NmzYEDC+fv16VatWzUAi8+bOnatn\nnnlGq1atUnJysvr166fVq1f7rvRx4MAB7du3z3RMo4rbbzRH0TpI/fr1dd1112nIkCGqVq2arr/+\netORjKlfv74qV66ssmXL6tSpU3r++ef1+eef+85tFhISory8PMMpi9aYMWMkXTiia8KECbrqqqt8\ny/Lz87V582ZFRUWZimfc3XffrTFjxvjmKScnRxs2bND48eP14IMPGk5nDvMSqHv37ho7dqzOnTun\nG2+8UdKFTW4TJ04ssUdcHzt2TM2bN5ck3X///SooKFBKSook6e2339Zjjz2mb775psRu1peK3280\nBc9hOnfurGeffbbEH8n1w3N29evXT3369NH+/fuVkJCg2bNn+76MSoqLm0y8Xq+2b9/ut2kgNDRU\n0dHR6tevn6l4xqWkpOjEiRPq16+fzpw5o+TkZIWGhqpfv37q2bOn6XjGMC+B+vXrpyNHjmjMmDG+\nneZDQkKUnJzsKzUlzbXXXqvt27erRo0akqSBAwfqnnvuUXZ2turWratx48bp9OnThlOaV5x+o11e\nr9drOgT+5+jRo5o9e7a6d++usLAw03EcZc+ePRo9erQ2bdqkRo0a6bnnnlN4eLjpWEVuxIgReuKJ\nJ1SuXDnTURzp1KlT+vrrr+X1elW3bt0SfYqU72NeAuXl5fkuY1fS52T27Nn6+OOPNWXKFNNRHK04\n/UZT8AAAACzDQRYAAACWoeABAABYhoLnQLm5uZoyZUqJvq5oYZiXQMxJ4ZiXwjEvhWNeAjEnhStO\n80LBc6Dc3FylpaUVi/+AihLzEog5KRzzUjjmpXDMSyDmpHDFaV4oeAAAAJah4AEAAFiGggcAAGAZ\nCp4Dud1uRUREyO12m47iKMxLIOakcMxL4ZiXwjEvgZiTwhWneeFExwAAAJbhWrQ/MPimUfou+7Dp\nGJq98xXdW3ug6RiOw7wEYk4Kx7wUjnkpHPMSyGlz4gp2xlqzWdumqFf9B03HUOWIipr0wVOXXE7B\n+4Hvsg9r/66DpmNIkmNyOA3zEog5KRzzUjjmpXDMSyAnzYkr2DmVZf+u70xH+EnsgwcAAGAZCh4A\nAIBlKHgAAACWoeABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAA\nAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACWoeABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAA\nWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACWKfYF7/z586YjAAAA\nOIrjCt6qVavUs2dPtWzZUq1atVL//v21fft2SVJ2draioqK0ZMkS9e7dW40bN9Zbb70lSdq4caN6\n9eqlxo0b65ZbbtHo0aN14sQJkx8FAADACMcVvFOnTqlPnz5asGCBZs2aJY/Hoz/96U9+a+omTpyo\nnj17asmSJbrtttv01VdfqX///oqLi9PixYuVlpam//73v3riiScMfhIAAAAzgk0H+KH4+Hi/+888\n84yaN2+uzZs3q2rVqpKkXr16+T1u4sSJuuOOO9SnTx9JUs2aNZWamqrExEQdPnxYFStWLLL8AAAA\npjmu4O3Zs0eTJ0/W5s2bdfjwYRUUFMjr9SonJ8dX8Bo1auT3nK1bt2r37t1asmSJ37jL5dKePXsC\nCl5ubq5yc3P9xtxut8LDw6/AJwIAALgycnJylJ+f7zfm8Xjk8nq9XkOZCtWhQweFh4drwIABqlq1\nqoKDg9WhQweNGTNGLVq0UFxcnBYsWKDo6Gi/57Ru3dq3Bu/7qlatqtDQUL+xKVOmKC0tzW8sIiJC\nmZmZV+QzAQAAXAmxsbHKzs72Gxs0aJCz1uAdPXpUO3bs0OjRo9WyZUtJF9bO/dSRsr/73e+0bds2\n1axZ82e9T+/evZWYmOg35na7JUn31h6o/bsO/or0l9fygvlqF5RkOobjMC+BmJPCMS+FY14Kx7wE\nctqcuIKdUVneO/t3xYf+P9MxVDWysmZtm6I5c+YUugbPGbP1fypUqKBrrrlG8+bNU7Vq1fTtt99q\n/PjxCv6Jf6kpKSnq0aOHUlNT1aNHD5UtW1bbt2/X+++/r6effjrg8R6PRx6P50p9DAAAgCJxqd3L\nHHUUrcvl0uTJk5WVlaWOHTvqL3/5iwYPHuy3idXlcgU8r0GDBpo9e7b27dunXr16qXPnzpo0aZLC\nwsKKMj4AAIAjOGoNniS1atVKixcv9hvbuHGj7/aXX35Z6POio6M1derUK5oNAACgOHDUGjwAAAD8\ndhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALAMBQ8AAMAyFDwAAADL\nUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxD\nwQMAALAMBQ8AAMAyFDwAAADLUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwF\nDwAAwDLBpgM4jbt2LblDy5uOIUly169jOoIk6XyYM+bjIm/MDaYjSJIONCtrOoLP/gdjTEeQJJ2p\naDqBv92pzpiX2pO2mI7gx+3xmI4gSXKVL2c6gp/giOqmI0iSzmfvMx3Bkbznz5uO4OOELN7z+T+6\nnDV4AAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACW\noeABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiG\nggcAAGAZCh4AAIBlKHgAAACWoeABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAAWIaCBwAAYBkK\nHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZ4wVv4cKFatWqlc6dO+c3PmTIEA0cOFCS9I9//EPx8fFq\n1KiR4uPjNX/+fL/HRkVF6b333vMbi42N1fTp069seAAAAAcyXvDat28vSVqxYoVv7MSJE1qxYoWS\nkpK0fPlyjRkzRn369NGSJUuUnJysp556Sh988IGhxAAAAM4WbDpAqVKldOedd2rBggVKSEiQJC1a\ntEjlypVTmzZt1LNnT3Xp0kX33HOPJCkyMlJbt27V1KlT1bZt21/1nrm5ucrNzfUbc7vdCg8P/02f\nBQAAoCjl5OQoPz/fb8zj8ZgveJKUlJSku+66S/v371fVqlX1zjvvqGvXrgoKCtKOHTvUrVs3v8c3\nbdpUmZmZv/r9ZsyYobS0NL+xiIgIZWZmakbm8F/9upfbsqxxpiM40r9XjzIdwXE2v/iI6QiOlJXq\nkHlJNR3A37KjfzMdwZGW7nnRdATHWV4w/6cfVAI5aV569uyp7Oxsv7FBgwY5o+BFRUWpYcOGSk9P\nV1xcnLZs2aIJEyb4lrtcroDnfH/M5XLJ6/X6LT9//vwl3693795KTEz0G3O73ReWxT6n/dlHftXn\nuJyWZY1TQoNhpmNIks6HlTcdweffq0fptpvGmI4hSTrQrKzpCJIulLvrH55kOoYk6UxF0wn+Jyv1\nETV4yhnzUnvSFtMRfJYd/ZsSru5vOoYkyVW+nOkIPkv3vKj2NR82HUOSdD57n+kIki6UmHZBSaZj\nOI5T5qVqZJhm73xFc+bMce4aPEm6++67NW3aNB0+fFjNmjVTZGSkJKlOnTr65JNP1LVrV99jP/nk\nE9WrV893v2LFijp48KDv/nfffed3/4c8Ho88Hs8V+BQAAABF51K7lxk/yOKiO+64QwcPHtQ//vEP\nJSX9rxn3799fGRkZmjNnjnbt2qVZs2bpn//8p1JSUnyPufHGGzVnzhxt2bJFX3zxhUaMGKHSpUub\n+BgAAADGOabglS1bVu3bt1dISIjvYAtJuu222/TnP/9ZM2fO1B133KHZs2dr9OjRatOmje8xw4YN\nU82aNZWcnKzBgwfr7rvvVsWKDtpWBAAAUIQcs4lWkg4ePKg77rgjYO1b9+7d1b1790s+r0qVKnr9\n9df9xtq1a3dFMgIAADidIwresWPH9NFHH2nNmjVatGiR6TgAAADFmiMKXmJionJzc/Xoo4+qbt26\npuMAAAAYJwz/AAAdLUlEQVQUa44oeL/lnHYAAADw55iDLAAAAHB5UPAAAAAsQ8EDAACwDAUPAADA\nMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALAMBQ8AAMAyFDwAAADL\nUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxD\nwQMAALAMBQ8AAMAyFDwAAADLUPAAAAAsE2w6gNPk79yt/F0HTceQJOVv22E6giTJtc10An+uNZ+Z\njiBJOj3496Yj+Jy++bjpCJKk6tNKmY7gJ3ztWdMRJElnmtc3HcGPU/KEHDltOoKf/CrXmI4gSXJ9\nd8h0BB9XKef8P+09c8Z0hGKFNXgAAACWoeABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAAWIaC\nBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACWoeABAABYhoIHAABgGQoe\nAACAZSh4AAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgA\nAACWoeABAABYhoIHAABgGQoeAACAZYptwevVq5fGjBnzs+8DAACUFI4veOnp6WrSpEnA+Msvv6xH\nH33UQCIAAABnCzYd4Kd4vV65XK6AcY/HYyANAACA8zlmDd769evVvXt3NWnSRM2bN1f37t01Z84c\njRw5UqdOnVJUVJQaNmyotLQ0SWyCBQAAuBRHrMHLz8/XAw88oKSkJE2YMEHnzp3TF198oXr16mnk\nyJGaNGmSVqxYIa/XqzJlypiOCwAA4GiOKHgnTpzQ8ePHdeutt6pGjRqSpNq1a0uSvvjiC7lcLlWs\nWPGyvV9ubq5yc3P9xtxut8LDwy/bewAAAFxpOTk5ys/P9xvzeDzOKHgVKlRQly5d1K9fP7Vu3Vqt\nW7dWQkKCqlWrdkXeb8aMGb5NvRdFREQoMzNTs3e+ckXe89dYXjDfdARHYl4CfdXtSdMRLuhmOoC/\nD5YNMx3Bkd7/93DTERzpvU9Gm47gOO+dmm06giM56XeoZ8+eys7O9hsbNGiQMwqeJI0dO1Z9+vTR\nqlWrtGLFCk2ePFkvv/zyFXmv3r17KzEx0W/M7XZLku6tPVD7dx28Iu/7SywvmK92QUmmYziOk+Zl\n17zfm44g6UK5u+7tp03HkCRVn1bKdASfD5YNU9uEcaZjSJJc572mI/i8/+/huvW250zHkCSFHDlt\nOoLPe5+MVnyz0aZjXPDF16YTSLpQ7uKvutd0DB/vmTOmI0hyzu9Q1cgwzd75iubMmePcNXgXNWjQ\nQA0aNNCAAQOUkpKi9PR0tW3bVgUFBZf1fTweD0fhAgCAYu9Su5c54ijavXv3asKECfr000+1b98+\nrVu3TllZWapfv74iIiJ05swZrVmzRkeOHNHp0875iw8AAMCJHLEG76qrrtI333yjwYMH68iRI6pc\nubI6d+6sAQMGyO12q0ePHnr00Ud17NgxPfDAAxo0aFDAa/zwXHmFnTsPAACgJHBEwatUqZKmTJly\nyeWpqalKTU31G5s1a5bf/ZkzZ/7ofQAAgJLCEZtoAQAAcPlQ8AAAACxDwQMAALAMBQ8AAMAyFDwA\nAADLUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAA\nACxDwQMAALAMBQ8AAMAyFDwAAADLUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAA\nsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALAMBQ8AAMAyFDwAAADLBJsO4Dgu14V/nMApOZzGIfNS\n96EDpiNc0M1BWa4qbTqBn6u2HTQdQZK0OynCdAQ/B5qXMh1BknSirrPWMWTdX8Z0BEnS756tYjqC\nj7uac7Kc37XHdIRixVn/dwEAAOA3o+ABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAAWIaCBwAA\nYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACWoeABAABYhoIHAABgGQoeAACA\nZSh4AAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACW\noeABAABYhoIHAABgGQoeAACAZSh4AAAAlrGu4GVnZysqKkpbt241HQUAAMAI6wqe1+uVy+UyHQMA\nAMCYYlnwVq1apZ49e6ply5Zq1aqV+vfvrx07dkiSbrvtNknSXXfdpaioKCUnJ5uMCgAAUOSCTQf4\nNU6dOqU+ffooKipKp06d0quvvqr7779f7777rubPn6+kpCS98cYbatCggUJCQkzHBQAAKFLFsuDF\nx8f73X/mmWfUvHlzbd68WVWrVpUkVahQQZUqVSr0+bm5ucrNzfUbc7vdCg8PvzKBAQAAroCcnBzl\n5+f7jXk8Hrm8Xq/XUKZfbc+ePZo8ebI2b96sw4cPq6CgQKdPn9YLL7ygxo0bKy4uTgsWLFB0dHSh\nz58yZYrS0tL8xiIiIpSZmVkU8QEAAC6L2NhYZWdn+40NGjSoeK7Bu++++xQeHq6nn35aVatWVXBw\nsDp06KBz5879rOf37t1biYmJfmNut1uSdG+dB7R/18HLnvmXWp4/T+3cd5uO4ThOmpfgqlVMR5Ak\nLd2XpvbVB5mOccFVpU0n8Fm6/QW1r/uY6RiSpN1JEaYj+Gx97hFFD59kOoYk6UTdn/edXRR2pQxV\n5NTnTceQJP3u2W9NR5AkLd05Ue1rP2o6hs/5XXtMR5AkLS+Yr3ZBSaZjqGpkmGbvfEVz5swpdA1e\nsSt4R48e1Y4dOzR69Gi1bNlSkrR161adP39eknz73P3ww36fx+ORx+O58mEBAACuoEvtXlbsCl6F\nChV0zTXXaN68eapWrZq+/fZbjR8/XsHBFz5KpUqVVLp0aa1evVoREREqVaqUypUrZzg1AABA0Sl2\np0lxuVyaPHmysrKy1LFjR/3lL3/R4MGDFRoaKunCptZRo0bp7bff1i233KKBAwcaTgwAAFC0it0a\nPElq1aqVFi9e7De2ceNG3+1u3bqpW7duRR0LAADAEYrdGjwAAAD8OAoeAACAZSh4AAAAlqHgAQAA\nWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACWoeABAABYhoIHAABg\nGQoeAACAZSh4AAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBl\nKHgAAACWoeABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAAWIaCBwAAYJlg0wEcx+u98I8TOCWH\n0zhkXs5/u990BB8nZXGS8zt3mY4gSarx8nemI/zPc1KNlz8znUKS5KpV3XSE/0mRGk4+ajqFJGnJ\n2sWmI/yfiQ7KInX4XRvTEXzcV1cwHUFuT/kfXc4aPAAAAMtQ8AAAACxDwQMAALAMBQ8AAMAyFDwA\nAADLUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAA\nACxDwQMAALAMBQ8AAMAyFDwAAADLUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAA\nsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALDMZS14vXr10pgxYy7nSwIAAOAXYg0eAACAZSh4AAAA\nlrnsBa+goECTJk3SjTfeqJiYGI0bN863LDc3V8OGDVPLli11ww03qG/fvvr66699y9PT09WkSROt\nXLlS7du3V+PGjTVw4ECdOHFCy5Yt0+23367mzZtr6NChOnv2rN/7Tp06Ve3atdMNN9ygTp06adGi\nRZf7owEAABQLl73gLV68WMHBwXrrrbf05JNPaubMmXr33XclScOGDdPnn3+uV199VW+//bZKly6t\nAQMG+JW1c+fO6c0339TEiRM1Y8YMff7553rooYeUkZGhtLQ0vfLKK/rggw80d+5c33MmTZqkd955\nR6NHj9a7776r++67T6mpqfrwww8v98cDAABwvODL/YJ169bVgw8+KEmKjIzUvHnztHbtWkVHR+v9\n99/XnDlz1KxZM0nS+PHj1bZtWy1atEjdunWTJOXn5ys1NVWRkZGSpDvvvFMzZ87UmjVrVKFCBUlS\nXFyc1q1bpz59+ujUqVN688039cYbb/heNyIiQp999pnmzp2rNm3aXO6PCAAA4GiXveA1aNDA736V\nKlV06NAhbd++XW63W40bN/YtK1eunK677jpt377dNxYaGuord5JUuXJlVa5c2VfuJKlSpUq+53z9\n9dc6c+aMBgwY4Pe++fn5qlGjRqEZc3NzlZub6zfmdrsVHh7+Cz8tAACAOTk5OcrPz/cb83g8l7/g\nhYSE+N13uVwqKCiQ1+v9Wc93u90Bzw8ODg4YKygokCTf6/71r38NKGg/fN5FM2bMUFpamt9YRESE\nMjMzNXvnKz8rZ1FYXjDfdARHYl4CMSeFY14K96/jb5qO4EjLtj5rOsL/cUoOKajaNtMRfJYdNp3g\nf5YdnmY6gk/Pnj2VnZ3tNzZo0KDLX/AupV69esrPz9enn36q5s2bS5JOnDihr776yrd59teoW7eu\nQkNDlZ2drZYtW/6s5/Tu3VuJiYl+YxeL5b21B2r/roO/Os/lsrxgvtoFJZmO4TjMSyDmpHBOmpeg\n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\nsWPH6q233tLx48eVmprqW/7uu+/qxRdf1MMPP6z09HRde+21mj59ul+Ozp07a8KECTp58qT69++v\n+Ph4vfzyy9q7d++vnQsAAAArBP+cBx09elSLFi1SRkaGvvrqK918880aNWqUbr31VoWEhPget3bt\nWmVlZWndunUKDQ2VJD300EPKzMxURkaG+vfvL0nKz89XamqqIiMjJUn9+vXTyJEjfa8zc+ZMde3a\nVUlJSZKk+++/Xx9//LF2797te4zL5dItt9yiW265RXl5eVq2bJkyMjL06quvqkmTJurSpYvat2+v\nMmXKBHye3Nxc5ebm+o253W6Fh4f/rEkDAABwgpycHOXn5/uNeTyen1fwZs+erbS0NDVt2lTvvffe\nJYvQF198oVOnTqlVq1Z+4+fOnfMrZ6Ghob5yJ0lVqlTR+fPnlZubK4/Hox07dujuu+/2e43GjRv7\nvcb3lSlTRl27dlXXrl315ZdfasiQIRo1apTcbre6dOkS8PgZM2YoLS3NbywiIkKZmZmavfOVH5+M\nIrS8YL7pCI7EvARiTgrHvBRuef480xEc6V/H3jAdwXH+/dEo0xG+xzlZPNX3mI7g07Nnz4Dd3AYN\nGvTzCl737t0VEhKihQsXqkOHDmrXrp06d+6s1q1bKyjof1t5CwoKVLlyZc2dOzfgNcqWLeu77Xa7\n/ZZdPDq2oKDg53+i7zl79qw++OADLVq0SB9++KHq16+vJ554QnFxcYU+vnfv3kpMTPQbu5jp3toD\ntX/XwV+V43JaXjBf7YKSTMdwHOYlEHNSOEfNi4POALA8f57aue/+6QcWgaBy5UxH8PnXsTd0e4V+\npmNIkvIb1TEdQdKFcnfbH8aYjuHzzvy/mo4g6UK5y91X03QMudw1VL7qWs2ZM+fXr8ELCwvTfffd\np/vuu0+bN29Wenq6Hn30UYWEhKhjx47q1KmTGjZsqOjoaB06dEgul0s1atT41aHr1KmjTZs2qWvX\nrr6xTZs2BTxuw4YNWrRokZYtW6bSpUurY8eOSk9PV7169X709T0ejzwez6/OBwAA4ASX2qr6swre\n911//fW6/vrrNXLkSL3//vt65513lJSUpBkzZigmJkZNmjTRwIED9dhjj6lOnTo6ePCgVq9erZiY\nGDVr1uySr+v1en23k5OTNXz4cP3+979Xy5YttWzZMm3evFlXX3217zEZGRlKTU1VXFycJk2apJiY\nGM6TBwAAoF9R8C4KCQlRfHy84uPjdfjwYd8mzqlTp2ry5Ml68skndejQIVWuXFlNmzYtdF+47/t+\nOevQoYP27t2ryZMn69SpU4qNjVXfvn2Vnp7ue0xMTIw++ugjv02/AAAA+A0F7/sqVqzou12mTBmN\nHDnS76jY70tMTAzY/61ly5b68ssv/cb++Mc/6o9//KPf2KBBg3y3w8LCfmtsAAAAKxWrS5UBAADg\np1HwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALAMBQ8AAMAyFDwAAADLUPAAAAAs\nQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALAM\nBQ8AAMAyFDwAAADLUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIU\nPAAAAMsEmw4AANbzek0n8OeQPAXHj5uO4McpeVxrPzMdwcdJWe6qcaPpCJKk5QXOyFI1Mkyzd156\nOWvwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALAMBQ8AAMAyFDwAAADLUPAAAAAs\nQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIUPAAAAMtQ8AAAACxDwQMAALAM\nBQ8AAMAyFDwAAADLUPAAAAAsQ8EDAACwDAUPAADAMhQ8AAAAy1DwAAAALEPBAwAAsAwFDwAAwDIU\nPAAAAMtQ8AAAACxDwQMAALAMBQ8AAMAyFDwAAADLUPAAAAAsE2w6gAm5ubnKzc31G3O73QoPDzeU\nCAAA4JfLyclRfn6+35jH45HL6/V6DWUyZsqUKUpLS/Mbi4iIUGZmpqFEAAAAv1xsbKyys7P9xgYN\nGlQyC96PrcG7t/ZA7d910FCy/1leMF/tgpJMx3Ac5iUQc1I45qVwzEvhmJdAzEnhnDIvVSPDNHvn\nK5dcg1ciN9F6PB55PB7TMQAAAH6TS+1exkEWAAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah\n4AEAAFiGggcAAGAZCh4AAIBlKHgAAACWoeABAABYhoIHAABgGQoeAACAZSh4AAAAlqHgAQAAWIaC\nBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGAZCh4AAIBlKHgAAACWoeABAABYhoIHAABgGQoe\nAACAZSh4AAAAlqHgAQAAWIaCBwAAYBkKHgAAgGUoeAAAAJah4AEAAFiGggcAAGCZYNMBnKZyREXT\nEXyqRoaZjuBIzEsg5qRwzEvhmJfCMS+BmJPCOWFefqqvuLxer7eIsgAAAKAIsInWgXJychQbG6uc\nnBzTURyFeQnEnBSOefn/7daxDUQhDERBpAtcEu3RLGVYugLsHPiaqWD1ou3p0tOl0qT3UhcH70KZ\nOfbeIzNPT7mKLpUmPV16uvR0qTTpvdTFwQMA+BgHDwDgYxw8AICP+a211ukRVBEx5pwjIk5PuYou\nlSY9XXq69HSpNOm90uUPeqZb7reGJU8AAAAASUVORK5CYII=\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f747c0e2990\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "translate(u'¿todavia estan en casa?')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 34,
      "metadata": {
        "colab": {
          "height": 714
        },
        "colab_type": "code",
        "executionInfo": {
          "elapsed": 490,
          "status": "ok",
          "timestamp": 1554308144847,
          "user_tz": 420
        },
        "id": "DUQVLVqUE1YW",
        "outputId": "a89cab87-e867-4789-e71c-e742a0ad743c"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Input: \u003cstart\u003e trata de averiguarlo . \u003cend\u003e\n",
            "Predicted translation: try to figure it out . \u003cend\u003e\n"
          ]
        },
        {
          "data": {
            "image/png": "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\nL3/5i4YNG6Z58+YpKChIU6ZM0fLly9WqVSvddNNNpuMZtXXrVj311FP6n//5H+3bt0+S9NFHH2nT\npk2Gk5nz0UcfqaCgQPXq1VOHDh3UqVMnyhpnNXnyZPXt21cLFizwOXeoTZs2jjzhTKKwHWPjxo1q\n2bKlJGnp0qUKDQ3V559/rqefflp///vfDaczY+fOnd4b8wcFBen48eMqV66cHnzwQc2ePdtwOnO4\n3ti/kSNHqnXr1kpOTnbsGy6cY+PGjX6PY1erVk0HDhwwkOjXUdgOcezYMYWFhUk69Ybcrl07BQUF\nqWXLltq9e7fhdGZUrFjRW0bVqlXzfnRiYWHhZX2ZzunrjV988UWflUGLFi2UmZlpMJlZn332mZ54\n4gllZWWpd+/eatu2raZPn64dO3aYjgYHKl++vN/3kR07dhS7H4ZTUNgOUatWLa1fv155eXlatWqV\n4uLiJElHjhy5bD/8IyYmRuvWrZMk3XrrrZo0aZJSU1OVmJh42V3qdiauN/YvNDRUd911l1599VWt\nWLFCvXv31qeffqrOnTvr7rvvNh0PDtO2bVulpqb63O1sz549eu6559S+fXuDyc6Oy7ocon///nri\niScUEhKi2rVr68Ybb5R06palNt3rtiQlJiZ6Pw97+PDhOnbsmD788ENdeeWVGjVqlOF05nC98a+r\nXr26evXqpdq1a+uvf/2rNm7caDoSHObJJ5/UwIED1bJlS504cUL33XefDh48qNjYWD3yyCOm4/nF\nWeIO8vXXXysnJ0dxcXHe23GuWLFCv/vd79SsWTPD6UpXQUGBPvvsM8XExHivVccpU6ZM0bp16zR9\n+nR16tRJ7777rvbv369Ro0apR48eGjZsmOmIRn355Zd6//33tWTJEknS73//e3Xr1s17jghwpi++\n+MJ7VUF0dLR376YTUdgOcPToUW3dulXNmzcv9ti6det01VVXXZZ3+7ruuuu0aNGiYivJy52/642L\niorUpUuXy/p648mTJ+uDDz7QwYMH1aZNG3Xt2lW///3vFRwcbDoaHMbW91wK2wF+/PFH3XzzzXr5\n5Zd9VtKbN29Wz5499emnnyo8PNxgQjN69uypESNGOPovXpN2796tjRs3cr3xf/3hD39Qly5d1Llz\nZ1WuXNl0HDiYre+5HMN2gNDQUMXHxysjI8PnH897772nNm3aOPIfTmkYNmyYJk2apIceekjR0dHF\n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\n2rdvn5KTk7V9+3atWLFCzz//vHr37u33+DUAADayrrAHDBigoKAgde7cWXFxcSosLNSsWbO0ZcsW\nJSQkaMyYMerSpYtGjBhhOioAACXGul3iDRo00JtvvukzVrt2bc2bN89QIgAALj3rVtgAAFyOKGwA\nACxAYQMAYAEKGwAAC1DYAABYgMIGAMACFDYAABagsAEAsACFDQCABShsAAAsQGEDAGABChsAAAtQ\n2AAAWIDCBgDAAhQ2AAAWoLABALAAhQ0AgAUobAAALEBhAwBgAQobAAALUNgAAFiAwgYAwAIUNgAA\nFqCwAQCwAIUNAIAFKGwAACxAYQMAYAEKGwAAC1DYAABYINB0AKcp/G63CnftNx1DklT47U7TESRJ\nTZKcMR+SpGFSk6RNplNIkg7eda3pCF6Hrw4xHcHrRLjLdAQvJ2X5/o9NTEfwclKW2q9vMR3By101\n3HQEuatUPutjrLABALAAhQ0AgAUobAAALEBhAwBgAQobAAALUNgAAFiAwgYAwAIUNgAAFqCwAQCw\nAIUNAIAFKGwAACxAYQMAYAEKGwAAC1DYAABYgMIGAMACFDYAABagsAEAsACFDQCABShsAAAsQGED\nAGABChsAAAtQ2AAAWIDCBgDAAhQ2AAAWoLABALAAhQ0AgAUobAAALEBhAwBggcCSeBKPx6Pk5GR9\n+OGHOnLkiCIiItS4cWPNnDmzJJ4eAIDLXokU9ieffKL09HTNnTtXderUUbly5UriaQEAwH+VSGF/\n9913qlatmq6//vqSeLrzdvLkSQUFBZXq7wQAwISLLuzExESlp6fL5XIpMjJSERERatGihQ4dOuTd\nJX78+HElJydr6dKlqlixovr27av169erSpUqSklJkSTFx8erT58+6t+/v/e5+/TpoyZNmmjMmDHe\nbXr06KHvv/9eS5cuVevWrTV9+nTt3btXkyZN0meffSZJio2N1ejRo1W/fv2LfXkAADjCRZ90lpSU\npAcffFA1a9bU559/rnfeeafYNikpKVq7dq1eeuklzZ49W1u2bNHatWsv6Pf94x//UKNGjTR//nw9\n+uijOnHihPr27asKFSooLS1N8+bNU/Xq1dW/f3/99NNPF/vyAABwhIteYYeGhqpixYoKCAhQeHh4\nscfz8vI0f/58TZkyRa1atZIkPfPMM7r11lsv6PfdeOONuv/++73fn/4DYeLEid6xcePGKS4uTh9/\n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\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f74a12a9d50\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "# wrong translation\n",
        "translate(u'trata de averiguarlo.')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "RTe5P5ioMJwN"
      },
      "source": [
        "## Next steps\n",
        "\n",
        "* [Download a different dataset](http://www.manythings.org/anki/) to experiment with translations, for example, English to German, or English to French.\n",
        "* Experiment with training on a larger dataset, or using more epochs\n"
      ]
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "collapsed_sections": [],
      "name": "nmt_with_attention.ipynb",
      "provenance": [],
      "toc_visible": true,
      "version": "0.3.2"
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
